Visualización de datos en R

Encuentro 1

Pablo Ortiz (@pabort)
Sociedad Argentina de Estadística

¿Qué es un gráfico?

¿Qué es un gráfico?


Wilkinson

Gramática de gráficos

¿Qué es un gráfico?

  • Los datos son todo

  • Es posible más por menos

Wilkinson


¿Cómo está “formado” un gráfico? 🤔

Capas.

Datos

  • La representación de los datos define qué se puede hacer con ellos

  • La gramática requiere que tome una determinada estructura: tidy

Tidy formato

  • La manipulación previa y adecuación de la base de datos es sumamente imporante (aunque no lo abordaremos aquí)

Capas.

Mapping


Permite que un dataset genérico se entendido por un sistema gráfico:

  • Aesthetic mapping: vincula las variables de la base de datos con las propiedades gráficas en la geometría utilizada.

  • Facet mapping: vincula las variables de la base de datos a los paneles en un diseño de facetas.

Capas.

Estadísticas

  • La base de datos, en general, no contiene los valores que se buscan representar/visualizar.

  • Es necesario transformar las variables de interés

    • conteo de observaciones de cada categoría (gráfico de barras)
    • Medidas estadísticas de posición (boxplot)
  • En algunos tipos de gráficos se encuentran implícitas, mientras que en otros será necesario un “preprocesamiento” de la base de datos.

Capas.

Escalas


  • Define el tipo de gráfico a utilizar: puntos, líneas, barras…

  • Es posible más por menos

Capas.

Geometrías


  • Define el tipo de gráfico a utilizar: puntos, líneas, barras…

  • Representa las magnitudes o valores de interés en el espacio

Capas.

Facetas


  • Define paneles con subgráficos atendiendo a variables particulares de interés

  • Se toma en cuenta las variaciones de estas variables de particulares

  • la disposición de los paneles pueden tener una interpretación en si misma

Capas.

Coordenadas


  • Es necesario un formato tidy

  • Es posible más por menos

Capas.

Temas


  • Todas las partes del gráfico que no están vinculados a los datos

  • Títulos, fuentes, tipografía, anotaciones

Capas.

Gramática de gráficos con {ggplot2}

{ggplot2}


  • La Gramática de Gráficos es un sistema de diseño

  • {ggplot2} es una librería que busca implementar este sistema (desde luego, no lo hace al pie de la letra)

  • {ggplot2} no es la única implementación

logo

Principales referencias

Setup

library(tidyverse)
library(janitor)

fileurl <- "https://raw.githubusercontent.com/allisonhorst/palmerpenguins/main/inst/extdata/penguins.csv"

df <- read_csv(url(fileurl)) %>% 
  rename(especie = species,
         isla = island,
         pico_long_mm = bill_length_mm,
         pico_prof_mm = bill_depth_mm,
         aleta_long_mm = flipper_length_mm,
         peso_g = body_mass_g,
         sexo = sex,
         anio = year) %>% 
  mutate(especie = recode(especie, 
                          Adelie = 'Adelia',
                          Gentoo = 'Papúa',
                          Chinstrap = 'Barbijo'),
         sexo = recode(sexo,
                       male = 'macho',
                       female = 'hembra'))

ggplot(data = df,
       mapping = aes(x = aleta_long_mm, y = peso_g)) +
  geom_point(na.rm = TRUE)

ggplot(data = df) +
  geom_point(mapping = aes(x = aleta_long_mm, y = peso_g),
             na.rm = TRUE)

ggplot() +
  geom_point(mapping = aes(x = aleta_long_mm, y = peso_g),
             data = df, na.rm = TRUE)

Mapping {colour}

ggplot(data = df) +
  geom_point(mapping = aes(x = aleta_long_mm,
                           y = peso_g,
                           colour = especie))



Cada tipo de
geometría requiere
un mapping
diferente


{R Graph Gallery}

Galería GGplot

Estadísticas


  • Vinculadas a la geometría utilizada

  • Cada geometría tiene una estadística (stat) definida por default

  • Se puede incorporar como una capa del gráfico, o como un argumento en
    geom_*().

Capas.

ggplot(data = df) +
  geom_bar(mapping = aes(x = especie))




Se usa por default
stat = 'count'

df_cant <- df %>% 
  count(especie, name = 'cantidad')

ggplot(data = df_cant) +
  geom_bar(mapping = aes(x = especie, y = cantidad),
           stat = 'identity')




Si los se tienen datos “preprocesados” usar
stat = 'identity'

df_cant <- df %>% 
  count(especie, name = 'cantidad')

ggplot(data = df_cant) +
  geom_col(mapping = aes(x = especie, y = cantidad))




geom_col() usa por defecto 'identity'

ggplot(data = df) +
  geom_bar(aes(x = especie,
               y = after_stat(100 * count / sum(count))))




after_stat() permite modificar las estadísticas a representar, a partir de las que se calculan por default

ggplot(data = df) +
  geom_density(aes(x = peso_g))




Algunos estadísticas computan múltiples valores, y la geometría elegida utiliza una por dafault: por ejemplo, density

ggplot(data = df) +
  geom_density(aes(x = peso_g, 
                   y = after_stat(scaled)))




Es posible acceder a cambiar estos valores por defecto con after_stat()

Escalas


  • Cada elemento dentro de aes() tiene una escala (si no se especifica, se provee por default)

  • Se puede acceder y modificar mediante scale_<aesthetic>_<type>()

  • <type>(): genérico (discreto, continuo) o específico (por ejemplo, área)

Capas.

ggplot(data = df) +
  geom_point(mapping = aes(x = aleta_long_mm,
                           y = peso_g,
                           colour = especie))




En este caso, basado en el tipo de variable de “especie”, se fija por defecto una escala de colores discretos

ggplot(data = df) +
  geom_point(mapping = aes(x = aleta_long_mm,
                           y = peso_g,
                           colour = especie)) +
  scale_colour_brewer(type = 'qual')




Podemos explicitar el tipo de escala para esta variable: qual (cualitativa), seq (ordinal) o div (divergente)

ggplot(data = df) +
  geom_point(mapping = aes(x = aleta_long_mm, y = peso_g)) +
  scale_x_continuous(breaks = c(180, 200, 220)) +
  scale_y_continuous(trans = 'log10')




También se pueden controlar a x e y con escalas scales

Facetas


  • Permite separar los datos generando múltiples graficos dispuestos en paneles (matrices)

  • Permite combinar múltiples gráficos separados relacionados a través de alguna/s variables/s

  • ggplot2 permite dos tipos: facet_grid y facet_wrap

Capas.

ggplot(na.omit(df)) +
  geom_point(aes(x = aleta_long_mm, y = peso_g, colour = sexo)) +
  facet_wrap(~ especie)




En este caso, se puede controlar la cantidad de columnas y filas del panel \(\Rightarrow\) Conveniente para evitar solapamientos

ggplot(na.omit(df)) +
  geom_point(aes(x = aleta_long_mm, y = peso_g, colour = sexo)) +
  facet_grid(sexo ~ especie)




Coordenadas


  • Define cómo se se traslada los datos a graficar sobre el “lienzo”: cómo se interpretan x e y

  • Límites y transformaciones pude ser aplicadas a la escalas o a las coordenadas

  • Cobra relevancia en cartografía: mapear proyecciones

Capas.




Gráfico de barra en coordenadas cartesianas

ggplot(data = df) +
  geom_bar(aes(x = especie, fill = especie))




En un sistema de coordenadas polares:

  • x representa ángulo

  • y representa radio

ggplot(data = df) +
  geom_bar(aes(x = especie, fill = especie)) +
  coord_polar(theta = 'x')




En un sistema de coordenadas polares:

  • x representa ángulo

  • y representa radio


¿Qué sucede si cambiamos la representación theta?

ggplot(data = df) +
  geom_bar(aes(x = especie, fill = especie)) +
  coord_polar(theta = 'y') +
  expand_limits(y = 200)




Gráfico de torta en un sistema de coordenadas cartesianas

ggplot(data = df) +
  geom_bar(aes(x = "", y = after_stat(100 * count / sum(count)), fill = especie))




Gráfico de torta en un sistema de coordenadas polares

ggplot(data = df) +
  geom_bar(aes(x = "", y = after_stat(100 * count / sum(count)), fill = especie)) +
  coord_polar(theta = 'y')

Temas


  • Se trata de aspectos estéticos y visuales no relacionados con los datos

  • Pueden usarse temas completos que vienen predefinidos en la librería ggplot2

  • ggtheme extiende la lista de temas de ggplot2

  • Pueden aplicarse completos, o modificar parcialmente ciertos elementos

  • Los temas se definen de manera jerárquica

Capas.

theme_minimal() define un tema completo


ggplot(data = df,
       mapping = aes(x = aleta_long_mm, y = peso_g, colour=especie)) +
  geom_point() +
  labs(title = "Tamaño de de los pingüinos",
       subtitle = "Peso y longitud de las aletas según especie",
       caption = "Fuente: XXXX",
       x = "Longitud de las aletas (mm)",
       y = "Peso (g)",
       colour = "Especies")+
  theme_minimal() 

theme() permite modificar/sobreescribir los elementos de tema por default


ggplot(data = df,
       mapping = aes(x = aleta_long_mm, y = peso_g, colour=especie)) +
  geom_point(na.rm = TRUE, size = 1, alpha=0.8 ) +
  geom_smooth(method = "lm", aes(colour=especie)) +
  labs(title = "Tamaño de de los pingüinos",
       subtitle = "Peso y longitud de las aletas según especie",
       caption = "Fuente: XXXX",
       x = "Longitud de las aletas (mm)",
       y = "Peso (g)",
       colour = "Especies")+
  theme_minimal() +
  theme(legend.position = 'bottom',
        plot.title.position = 'plot',
        plot.caption = element_text(face = 'italic'),
        panel.grid.major = element_blank(),
        panel.grid.minor =  element_blank())